﻿using System.Runtime.Intrinsics.X86;
using System.Security.Cryptography;

namespace est12
{
    #region     知识点一   基本概念
    //结构体 是一种自定义变量类型 类似枚举需要自己定义
    //它是数据和函数的集合
    //在结构体中 可以申明各种变量和方法

    //作用：用来表现存在关系的数据集合 比如用结构体表现学生 动物 人类等等
    #endregion

    #region     知识点二   基本语法
    //1.结构体一般写在 namespace语句块中
    //2.结构体关键字 struct

    //strtic 自定义结构体名
    //{
    //  第一部分
    //  变量

    //  第二部分
    //  构造函数（可选）

    //  第三部分
    //  函数
    //}
    //注意：结构体名字 我们的规范是 帕斯卡命名法
    #endregion
    #region     知识点三   实例
    //表现学生数据的结构体
    struct Student
    {
        #region     知识点五   访问修饰符
        //修饰结构体中变量的方法 是否能被外部使用
        //public 公共的 可以被外部访问
        //private 私有的 只能在内容使用(默认私有的)
        //默认不写 为private
        #endregion

        //变量（结构体申明的变量 不能直接初始化）
        //变量类型可以写任意类型 包括结构体 但是 不能是自己的结构体
        //年龄
        public int age;//这里初始化会报错
        //学号
        public int number;
        //姓名
        public string name;

        //构造函数（后面会讲）
        #region     知识点六   结构体的构造函数
        /// <summary>
        /// 基本概念
        /// 1.没有返回值
        /// 2.函数名必须和结构体名相同
        /// 3.必须有参数
        /// 4.如果申明了构造函数 那么必须在其中对所有变量数据初始化
        /// </summary>

        public Student(int age, int number, string name)
        {
            //新的关键字：this
            //用来区分结构体内部的变量还是外面传来的
            this.age = age;
            this.number = number;
            this.name = name;
        }
        #endregion
        //函数方法
        //表现这个数据就结构的行为

        //注意：在结构体中的方法 目前不需要加static关键字
        public void Speak()
        {
            //函数中可以直接使用结构体内部申明变量
            Console.WriteLine("我是{0}，年龄是{1}", name, age);
        }
        //可以根据需求写无数个函数



    }
    #endregion
    //1.
    struct Fang
    {
        public int long1;
        public int width;
        public Fang(int long1, int width)
        {
            this.long1 = long1;
            this.width = width;
        }
        public void Shuo()
        {
            int zhouChang = (long1 + width) * 2;
            int mianJi = long1 * width;
            Console.WriteLine("长为{0}，宽为{1},周长为{2}，面积为{3}", long1, width, zhouChang, mianJi);
        }
    }

    //2.
    enum E_Occupation
    {
        len,
        rin,
        Miku,
    }
    struct Game
    {
        public string name;
        public E_Occupation occupation; 
        public Game(string name,E_Occupation occupation)
        {
            this .name = name;
            this .occupation = occupation;
        }
        public void ZhiYe()
        {
            switch(occupation)
            {
                case E_Occupation.len:
                    Console.WriteLine("玩家{0}选择了len，使用原地跳技能",name);
                    break;
                case E_Occupation.rin:
                    Console.WriteLine("玩家{0}选择了rin，使用瞎乱蹦技能", name);
                    break;
                case E_Occupation.Miku:
                    Console.WriteLine("玩家{0}选择了Miku，使用原地转圈技能", name);
                    break;
            }
        }
    }
    
    internal class class12
        {
            static void Main(string[] args)
            {
                Console.WriteLine("结构体");
                #region     知识点四   结构体的使用
                //变量类型 变量名;
                Student a1;
                a1.age = 12;
                a1.name = "洛";
                a1.number = 063;
                a1.Speak();

                //执行构造函数
                //重新赋值初始化
                Student a2 = new Student(19, 063, "秦洛南");
                a2.Speak();


                #endregion

                #region     作业
                //1.使用结构体描述矩形的信息，长，宽；创建一个矩形，对其长宽进行初始化，
                //并打印矩形的长、宽、面积、周长等信息。
                Fang b1 = new Fang(2,3);
                b1.Shuo();

            //2.使用结构体描述玩家信息，玩家名字，玩家职业
            //请用户输入玩家姓名，选择玩家的歌姬，最后打印玩家的攻击信息
            //歌姬：
            //len（技能：原地跳）
            //rin（技能：瞎乱蹦）
            //Miku（技能：原地转圈）
            Console.WriteLine("请输入姓名：");
            Game c1;
            c1.name = Console.ReadLine();
            Console.WriteLine("请选择歌姬：（len、rin、Miku）");
            string result = Console.ReadLine();
            E_Occupation o = (E_Occupation)int.Parse(result);
            Game game = new Game(c1.name,o);
            game.ZhiYe();

                #endregion

                //总结：
                //1.概念：结构体 struct 是变量和函数的集合 用来表示特定的数据集合

                //访问修饰符：public和private用来修饰变量和方法的  public外部可以调用 private内部用 不写的话默认就是私有的
                //构造函数：没有返回值 函数名和结构体名相同 可以重载 主要是帮助我们快速初始化结构体对象的

                //注意：
                //1.在结构体中申明的变量 不能初始化 只能在外面或函数中赋值（初始化）
                //2.在结构体中申明的函数 不用加static
            }
        }
    
}
